package es.udc.fbellas.j2ee.tiendaweb.model.propiedad.DAO;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import es.udc.fbellas.j2ee.tiendaweb.model.propiedad.TO.PropiedadTO;
import es.udc.fbellas.j2ee.util.exceptions.InternalErrorException;
import es.udc.fbellas.j2ee.util.sql.GeneralOperations;

/**
 * An implementation of <code>SQLAccountDAO</code> for databases providing
 * counter columns with JDBC 3 drivers.
 */
public class SQLPropiedadDAO {

/* comprobar si existe una propiedad por su id en la tabla de la BD */

    public boolean exists(Connection connection, int idPropiedad) 
        throws InternalErrorException {
        
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {

            /* Create "preparedStatement". */
            String queryString = "SELECT IDPROPIEDAD FROM PROPIEDAD WHERE IDPROPIEDAD = ?";
            preparedStatement = connection.prepareStatement(queryString);
            
            /* Fill "preparedStatement". */
            int i = 1;
            preparedStatement.setInt(i++, idPropiedad);
            
            /* Execute query. */
            resultSet = preparedStatement.executeQuery();

            return resultSet.next();
            
        } catch (SQLException e) {
            throw new InternalErrorException(e);    
        } finally {
            GeneralOperations.closeResultSet(resultSet);
            GeneralOperations.closeStatement(preparedStatement);
        }
        
    }



/* encontrar una propiedad a partir de su id */

    public PropiedadTO find(Connection connection, int idPropiedad) 
        throws InternalErrorException {
        
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
    
        try {
                
            /* Create "preparedStatement". */
            String queryString = "SELECT IDPROPIEDAD,NOMBREPROPIEDAD,VALOR,IDPRODUCTO FROM PROPIEDAD" + " WHERE IDPROPIEDAD = ?";
            preparedStatement = connection.prepareStatement(queryString);    
            
            /* Fill "preparedStatement". */
            int i = 1;
            preparedStatement.setInt(i++,idPropiedad);
                                    
            /* Execute query. */
			resultSet = preparedStatement.executeQuery();

            if (!resultSet.next()) {
                throw new InternalErrorException(new SQLException(
                    "No hay ninguna propiedad con ese id."));
            }

			/* get result */
			i = 1;
			int idProp = resultSet.getInt(i++);
			String nombreProp = resultSet.getString(i++);
			String val = resultSet.getString(i++);
			int idProduc = resultSet.getInt(i++);


			return new PropiedadTO(idProduc,idProp,nombreProp, val);
        
        } catch (SQLException e) {
            throw new InternalErrorException(e);
        } finally {
            GeneralOperations.closeStatement(preparedStatement);
			GeneralOperations.closeResultSet(resultSet);
        }
        
    }

/* encontrar una lista de propiedades de un producto */

    public List<PropiedadTO> findbyproducto(Connection conexion, int idProducto, int startIndex, int cont) 
        throws InternalErrorException {
        
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
    
        try {
                
            /* Create "preparedStatement". */
            String queryString = "SELECT IDPROPIEDAD,NOMBREPROPIEDAD,VALOR,IDPRODUCTO FROM PROPIEDAD" + " WHERE IDPRODUCTO = ?";
            preparedStatement = conexion.prepareStatement(queryString,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);    
            
            /* Fill "preparedStatement". */
            int i = 1;
            preparedStatement.setInt(i++,idProducto);
                                    
            /* Execute query. */
			resultSet = preparedStatement.executeQuery();

			/* leemos los objetos de la BD */
			List<PropiedadTO> propiedadTOs = new ArrayList<PropiedadTO> ();
			int contador = 0;
			
			if ((startIndex>=1)&&resultSet.absolute(startIndex)){
				do{
					i = 1;
					int idProp = resultSet.getInt(i++);
					String nombreProp = resultSet.getString(i++);
					String val = resultSet.getString(i++);
					int idProduc = resultSet.getInt(i++);
					propiedadTOs.add(new PropiedadTO(idProduc,idProp,nombreProp, val));

					contador++;

				} while (resultSet.next() && (contador<cont));
			}

			return propiedadTOs;
        
        } catch (SQLException e) {
            throw new InternalErrorException(e);
        } finally {
			GeneralOperations.closeResultSet(resultSet);
            GeneralOperations.closeStatement(preparedStatement);
        }
        
    }

    
    /* This class can by tested by "SQLPropiedadDAOFactory". */

}

